package com.example.library.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.library.dto.BaseQueryRequest;
import com.example.library.entity.Book;

import java.util.List;

/**
 * 图书服务接口
 *
   */
public interface BookService extends IService<Book> {

    /**
     * 分页查询图书列表
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<Book> getBookPage(BaseQueryRequest queryRequest);

    /**
     * 根据分类查询图书
     *
     * @param categoryId 分类ID
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<Book> getBooksByCategory(Long categoryId, BaseQueryRequest queryRequest);

    /**
     * 搜索图书
     *
     * @param keyword 关键词
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    IPage<Book> searchBooks(String keyword, BaseQueryRequest queryRequest);

    /**
     * 获取热门图书
     *
     * @param limit 限制数量
     * @return 热门图书列表
     */
    List<Book> getPopularBooks(Integer limit);

    /**
     * 获取最新图书
     *
     * @param limit 限制数量
     * @return 最新图书列表
     */
    List<Book> getLatestBooks(Integer limit);

    /**
     * 获取推荐图书
     *
     * @param limit 限制数量
     * @return 推荐图书列表
     */
    List<Book> getRecommendedBooks(Integer limit);

    /**
     * 根据ISBN查询图书
     *
     * @param isbn ISBN号
     * @return 图书信息
     */
    Book findByIsbn(String isbn);

    /**
     * 创建图书
     *
     * @param book 图书信息
     * @return 是否成功
     */
    boolean createBook(Book book);

    /**
     * 更新图书
     *
     * @param book 图书信息
     * @return 是否成功
     */
    boolean updateBook(Book book);

    /**
     * 删除图书
     *
     * @param bookId 图书ID
     * @return 是否成功
     */
    boolean deleteBook(Long bookId);

    /**
     * 批量删除图书
     *
     * @param bookIds 图书ID列表
     * @return 是否成功
     */
    boolean batchDeleteBooks(List<Long> bookIds);

    /**
     * 更新图书状态
     *
     * @param bookId 图书ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateBookStatus(Long bookId, Integer status);

    /**
     * 批量更新图书状态
     *
     * @param bookIds 图书ID列表
     * @param status 状态
     * @return 是否成功
     */
    boolean batchUpdateBookStatus(List<Long> bookIds, Integer status);

    /**
     * 更新图书库存
     *
     * @param bookId 图书ID
     * @param totalCount 总数量
     * @param availableCount 可借数量
     * @return 是否成功
     */
    boolean updateBookStock(Long bookId, Integer totalCount, Integer availableCount);

    /**
     * 借出图书（减少可借数量）
     *
     * @param bookId 图书ID
     * @return 是否成功
     */
    boolean borrowBook(Long bookId);

    /**
     * 归还图书（增加可借数量）
     *
     * @param bookId 图书ID
     * @return 是否成功
     */
    boolean returnBook(Long bookId);

    /**
     * 检查图书是否可借
     *
     * @param bookId 图书ID
     * @return 是否可借
     */
    boolean isBookAvailable(Long bookId);

    /**
     * 检查ISBN是否存在
     *
     * @param isbn ISBN号
     * @return 是否存在
     */
    boolean existsByIsbn(String isbn);

    /**
     * 获取库存不足的图书
     *
     * @param threshold 库存阈值
     * @return 库存不足的图书列表
     */
    List<Book> getLowStockBooks(Integer threshold);

    /**
     * 获取图书统计信息
     *
     * @return 统计信息
     */
    Object getBookStatistics();

}